package main

import (
	"fmt"
	"reflect"
)

// slicePrint 函数接受一个 interface{} 类型的参数，可以打印任何类型的切片
func slicePrint(slice interface{}) {
	// 断言参数是切片类型
	sliceValue := reflect.ValueOf(slice)

	if sliceValue.Kind() != reflect.Slice {
		fmt.Println("Provided argument is not a slice")
		return
	}

	for i := 0; i < sliceValue.Len(); i++ {
		fmt.Println(sliceValue.Index(i).Interface())
	}
}

func test01() {
	// 和声明 array 一样，只是少了长度
	var fslice []int
	slice := []byte{'a', 'b', 'c', 'd'}
	fmt.Println("fslice len: ", len(fslice))
	fmt.Println("slice len: ", len(slice))
}

func test02() {
	// 声明一个数组
	var array = [10]byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}
	// 声明两个 slice
	var aSlice, bSlice []byte

	// 演示一些简便操作
	aSlice = array[:3] // 等价于 aSlice = array[0:3] aSlice 包含元素: a,b,c
	slicePrint(aSlice)
	aSlice = array[5:] // 等价于 aSlice = array[5:10] aSlice 包含元素: f,g,h,i,j
	slicePrint(aSlice)
	aSlice = array[:] // 等价于 aSlice = array[0:10] 这样 aSlice 包含了全部的元素
	slicePrint(aSlice)

	// 从 slice 中获取 slice
	aSlice = array[3:7] // aSlice 包含元素: d,e,f,g，len=4，cap=7
	slicePrint(aSlice)
	bSlice = aSlice[1:3] // bSlice 包含 aSlice[1], aSlice[2] 也就是含有: e,f
	slicePrint(bSlice)
	bSlice = aSlice[:3] // bSlice 包含 aSlice[0], aSlice[1], aSlice[2] 也就是含有: d,e,f
	slicePrint(bSlice)
	bSlice = aSlice[0:5] // 对 slice 的 slice 可以在 cap 范围内扩展，此时 bSlice 包含：d,e,f,g,h
	slicePrint(bSlice)
	bSlice = aSlice[:] // bSlice 包含所有 aSlice 的元素: d,e,f,g
	slicePrint(bSlice)
}

func main() {
	test01()

	test02()
}
